package com.littcore.chart.echart.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.littcore.chart.echart.model.axis.Axis;
import com.littcore.chart.echart.model.series.Series;
import com.littcore.chart.echart.model.style.ItemStyle;


/**
 * .
 * 
 * <pre><b>描述：</b>
 *    
 * </pre>
 * 
 * <pre><b>修改记录：</b>
 *    
 * </pre>
 * 
 * @author <a href="mailto:littcai@hotmail.com">蔡源</a>
 * @since 2015年6月25日
 * @version 1.0
 */
public class Option implements Serializable {

  private static final long serialVersionUID = 4664955083296866542L;

  /**
   * 全图默认背景，（详见backgroundColor），默认为无，透明
   */
  private Object backgroundColor;
  /**
   * 数值系列的颜色列表，（详见color），可配数组，eg：['#87cefa', 'rgba(123,123,123,0.5)','...']，当系列数量个数比颜色列表长度大时将循环选取
   */
  private List<Object> color;
  /**
   * 非IE8-支持渲染为图片，（详见renderAsImage）
   * {boolean | string} false，非IE8-支持渲染为图片，可设为true或指定图片格式（png | jpeg），渲染为图片后实例依然可用（如setOption，resize等），但各种交互失效
   */
  private Object renderAsImage;
  /**
   * 是否启用拖拽重计算特性，默认关闭，（详见calculable，相关的还有 calculableColor， calculableHolderColor， nameConnector， valueConnector）
   */
  private Boolean calculable;
  /**
   * 是否开启动画，默认开启，（详见 animation，相关的还有 addDataAnimation， animationThreshold， animationDuration， animationEasing）
   */
  private Boolean animation;
  
  /**
   * 直角坐标系中横轴数组（详见xAxis），数组中每一项代表一条横轴坐标轴，标准（1.0）中规定最多同时存在2条横轴
   */
  private List<Axis> xAxis;
  /**
   * 直角坐标系中纵轴数组（详见yAxis），数组中每一项代表一条纵轴坐标轴，标准（1.0）中规定最多同时存在2条纵轴
   */
  private List<Axis> yAxis;
  /**
   * 驱动图表生成的数据内容（详见series），数组中每一项代表一个系列的特殊选项及数据
   */
  private List<Series> series;
  /**
   * 当使用timeline时，每一组数据要放到单独的option中
   */
  private List<Option> options;

  private ItemStyle itemStyle;

  /**
   * 获取itemStyle值
   */
  public ItemStyle itemStyle() {
      if (this.itemStyle == null) {
          this.itemStyle = new ItemStyle();
      }
      return this.itemStyle;
  }

  /**
   * 设置itemStyle值
   *
   * @param itemStyle
   */
  public Option itemStyle(ItemStyle itemStyle) {
      this.itemStyle = itemStyle;
      return this;
  }


  /**
   * 设置xAxis值
   *
   * @param xAxis
   */
  public Option xAxis(List<Axis> xAxis) {
      this.xAxis = xAxis;
      return this;
  }

  /**
   * 设置yAxis值
   *
   * @param yAxis
   */
  public Option yAxis(List<Axis> yAxis) {
      this.yAxis = yAxis;
      return this;
  }

  /**
   * 设置series值
   *
   * @param series
   */
  public Option series(List<Series> series) {
      this.series = series;
      return this;
  }

  /**
   * 设置options值
   *
   * @param options
   */
  public Option options(List<Option> options) {
      this.options = options;
      return this;
  }

  /**
   * 获取backgroundColor值
   */
  public Object backgroundColor() {
      return this.backgroundColor;
  }

  /**
   * 设置backgroundColor值
   *
   * @param backgroundColor
   */
  public Option backgroundColor(Object backgroundColor) {
      this.backgroundColor = backgroundColor;
      return this;
  }

  /**
   * 获取color值
   */
  public List<Object> color() {
      if (this.color == null) {
          this.color = new ArrayList<Object>();
      }
      return this.color;
  }

  /**
   * 设置color值
   *
   * @param colors
   */
  public Option color(Object... colors) {
      if (colors == null || colors.length == 0) {
          return this;
      }
      this.color().addAll(Arrays.asList(colors));
      return this;
  }

  /**
   * 获取renderAsImage值
   */
  public Object renderAsImage() {
      return this.renderAsImage;
  }

  /**
   * 设置renderAsImage值
   *
   * @param renderAsImage
   */
  public Option renderAsImage(Object renderAsImage) {
      this.renderAsImage = renderAsImage;
      return this;
  }

  /**
   * 获取calculable值
   */
  public Boolean calculable() {
      return this.calculable;
  }

  /**
   * 设置calculable值
   *
   * @param calculable
   */
  public Option calculable(Boolean calculable) {
      this.calculable = calculable;
      return this;
  }

  /**
   * 获取animation值
   */
  public Boolean animation() {
      return this.animation;
  }

  /**
   * 设置animation值
   *
   * @param animation
   */
  public Option animation(Boolean animation) {
      this.animation = animation;
      return this;
  }

  /**
   * 直角坐标系中横轴数组（详见xAxis），数组中每一项代表一条横轴坐标轴，标准（1.0）中规定最多同时存在2条横轴
   */
  public List<Axis> xAxis() {
      if (this.xAxis == null) {
          this.xAxis = new ArrayList<Axis>();
      }
      return this.xAxis;
  }

  /**
   * 添加x轴
   *
   * @param values
   * @return
   */
  public Option xAxis(Axis... values) {
      if (values == null || values.length == 0) {
          return this;
      }
      if (this.xAxis().size() == 2) {
          throw new RuntimeException("xAxis已经存在2个，无法继续添加!");
      }
      if (this.xAxis().size() + values.length > 2) {
          throw new RuntimeException("添加的xAxis超出了最大允许的范围:2!");
      }
      this.xAxis().addAll(Arrays.asList(values));
      return this;
  }

  /**
   * 直角坐标系中横轴数组（详见xAxis），数组中每一项代表一条横轴坐标轴，标准（1.0）中规定最多同时存在2条横轴
   */
  public List<Axis> yAxis() {
      if (this.yAxis == null) {
          this.yAxis = new ArrayList<Axis>();
      }
      return this.yAxis;
  }

  /**
   * 添加y轴
   *
   * @param values
   * @return
   */
  public Option yAxis(Axis... values) {
      if (values == null || values.length == 0) {
          return this;
      }
      if (this.yAxis().size() == 2) {
          throw new RuntimeException("yAxis已经存在2个，无法继续添加!");
      }
      if (this.yAxis().size() + values.length > 2) {
          throw new RuntimeException("添加的yAxis超出了最大允许的范围:2!");
      }
      this.yAxis().addAll(Arrays.asList(values));
      return this;
  }

  /**
   * 驱动图表生成的数据内容（详见series），数组中每一项代表一个系列的特殊选项及数据
   */
  public List<Series> series() {
      if (this.series == null) {
          this.series = new ArrayList<Series>();
      }
      return this.series;
  }

  /**
   * 添加数据
   *
   * @param values
   * @return
   */
  public Option series(Series... values) {
      if (values == null || values.length == 0) {
          return this;
      }
      this.series().addAll(Arrays.asList(values));
      return this;
  }

  /**
   * 当使用timeline时，每一组数据要放到单独的option中
   */
  public List<Option> options() {
      if (this.options == null) {
          this.options = new ArrayList<Option>();
      }
      return this.options;
  }

  /**
   * 添加Option数据
   *
   * @param values
   * @return
   */
  public Option options(Option... values) {
      if (values == null || values.length == 0) {
          return this;
      }
      this.options().addAll(Arrays.asList(values));
      return this;
  }

  /**
   * 获取xAxis值
   */
  public List<Axis> getxAxis() {
      return xAxis;
  }

  /**
   * 设置xAxis值
   *
   * @param xAxis
   */
  public void setxAxis(List<Axis> xAxis) {
      this.xAxis = xAxis;
  }

  /**
   * 获取yAxis值
   */
  public List<Axis> getyAxis() {
      return yAxis;
  }

  /**
   * 设置yAxis值
   *
   * @param yAxis
   */
  public void setyAxis(List<Axis> yAxis) {
      this.yAxis = yAxis;
  }

  /**
   * 获取backgroundColor值
   */
  public Object getBackgroundColor() {
      return backgroundColor;
  }

  /**
   * 设置backgroundColor值
   *
   * @param backgroundColor
   */
  public void setBackgroundColor(Object backgroundColor) {
      this.backgroundColor = backgroundColor;
  }

  /**
   * 获取color值
   */
  public List<Object> getColor() {
      return color;
  }

  /**
   * 设置color值
   *
   * @param color
   */
  public void setColor(List<Object> color) {
      this.color = color;
  }

  /**
   * 获取renderAsImage值
   */
  public Object getRenderAsImage() {
      return renderAsImage;
  }

  /**
   * 设置renderAsImage值
   *
   * @param renderAsImage
   */
  public void setRenderAsImage(Object renderAsImage) {
      this.renderAsImage = renderAsImage;
  }

  /**
   * 获取calculable值
   */
  public Boolean getCalculable() {
      return calculable;
  }

  /**
   * 设置calculable值
   *
   * @param calculable
   */
  public void setCalculable(Boolean calculable) {
      this.calculable = calculable;
  }

  /**
   * 获取animation值
   */
  public Boolean getAnimation() {
      return animation;
  }

  /**
   * 设置animation值
   *
   * @param animation
   */
  public void setAnimation(Boolean animation) {
      this.animation = animation;
  }

  /**
   * 获取series值
   */
  public List<Series> getSeries() {
      return series;
  }

  /**
   * 设置series值
   *
   * @param series
   */
  public void setSeries(List<Series> series) {
      this.series = series;
  }

  /**
   * 获取options值
   */
  public List<Option> getOptions() {
      return options;
  }

  /**
   * 设置options值
   *
   * @param options
   */
  public void setOptions(List<Option> options) {
      this.options = options;
  }

  /**
   * 获取itemStyle值
   */
  public ItemStyle getItemStyle() {
      return itemStyle;
  }

  /**
   * 设置itemStyle值
   *
   * @param itemStyle
   */
  public void setItemStyle(ItemStyle itemStyle) {
      this.itemStyle = itemStyle;
  }

}
